#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ''
__author__ = 'HaiFeng'
__mtime__ = '2016/11/16'
"""

from flask_socketio import emit
from web_flask.app import app, socketio
from web_flask.app import a

from flask_login import login_required
import json

#属于接收端 接收前台数据

@socketio.on('connect')
@login_required
def test_connect():
    # emit('my response',{'data':'Connection','cont':0})
    # _thread.start_new_thread(run, ())
    # thread = socketio.start_background_task(target=run)

    print("connected{0}".format(socketio.__dict__))
    print("socket后台on-connect执行  推送委托单 以及成交单")
    pushOrderList()   #每次链接推送委托单和成交单  因为订单和交易记录被动推送的时候只有一条



def pushOrderList():
    # 如果前台链接了就推送所有委托单以及成交单
    orderdict = []
    treaddict= []
    if len(a.Accounts.values()):
        for accountskey, account in a.Accounts.items():  # 查找所有用户
            if accountskey and account:  # 如果账户存在
                for orderk, order in account.t.DicOrderField.items():  # 遍历这个账户所有的订单
                    if order:
                        orderdict.append(order.__dict__)  # 添加到订单list

                for treadk, tread in account.t.DicTradeField.items():  # 遍历这个账户所有的成交
                    if tread:
                        treaddict.append(tread.__dict__)  # 添加到订单list
    socketio.emit('ordersTable', {'data': json.dumps(orderdict, ensure_ascii=False)})
    socketio.emit('tradeTable', {'data': json.dumps(treaddict, ensure_ascii=False)})





#这是一个测试 可有可无
@socketio.on('my event')
@login_required
def handle_my_costom_event(json):
    print('测试:' + str(json))
    emit('my event 返回', {'data': 'Connection', 'cont': 0})








#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------socket 主动函数启动
#---------------------------------------------------------------------------虚拟货币的主动函数  如果浪费资源了 这个可以重新启动-----------------------------------------------------------------------------------------------------socket 主动函数启动
# @socketio.on('select_userinfo')   #从前台传来select_userinfo事件  这里进行监听  这个移除了  登陆以后主动开启权益查询
# @login_required
# def select_userinfo(json):
#     #测试用  正常的是把这个写到py_at_adapter_test.py里面  然后从这里调用
#     #a.TradeInit()
#     #for i in ['adong','xiangke2','xiangke','chengcheng']:
#     for i in a.Accounts.keys():
#         a.Accounts[i].future_userinfo(True)
#     #a.Accounts['xiangke'].future_userinfo(True)

#-------------------------------------------------------------------------------------------------------------用户持仓查询
# @socketio.on('select_position')  # 从前台传来select_Position事件  这里进行监听
# @login_required
# def select_Position(json):
#     #a.TradeInit() #这个用于测试 以后需要删掉即可
#     #a.Accounts["xiangke"].future_position([], 'quarter', 1)
#     # for i in ['adong', 'xiangke2', 'xiangke', 'chengcheng']:
#     for i in a.Accounts.keys():
#         a.Accounts[i].future_position([],'quarter',1)

# def on_web_positions(positions):  # 从后台传输过来的useriinfo信息对前台进行输出
#     """
#     :param position:网前台输入当前的position情况
#     :return:
#     """
#     socketio.emit('positionTable', {'data': json.dumps(positions)})
#----------------------------------------------------------------------------------------------------------------虚拟货币的主动查询函数 如果浪费资源了可以启用


#属于主动发送端     --------发送的数据来此后天

#行情回调 并发送到前台

def on_web_tick(tick):
    # print(tick)
    socketio.emit('strategTable', {'data': tick.__dict__, 'cont': 0})



#账户信息回调  并发送到前台
def on_web_userinfo(Acccount):
    usersinfo = {}
    usersinfo[Acccount.AccountId] = Acccount.__dict__
    socketio.emit('userinfotable', {'data': json.dumps(usersinfo), 'cont': 0})


#账户持仓回调  并发送到前台
def on_web_position(Positions):
    usersposition = {}
    for k, v in Positions.items():
        usersposition[k] = v.__dict__
    socketio.emit('positiontable', {'data': json.dumps(usersposition), 'cont': 0})



#报单回报
def on_web_onrtnorder(OrderField,info=None):
    print("on_web_onrtnorder")
    if isinstance(OrderField,list):          #虚拟货币使用独特的 以后可能需要改回阿里虚拟货币返回来就是list  最好是每次策略下单以后自动调用 其他的手动调用
        orderdict = OrderField
    else:
        orderdict = []
        orderdict.append(OrderField.__dict__)
    socketio.emit('ordersTable',{'data':json.dumps(orderdict, ensure_ascii=False)})

#成交回报
def on_web_onrtnTrader(TradeField):
    print("on_web_onrtnTrader")
    traderdict= []
    traderdict.append(TradeField.__dict__)
    socketio.emit('tradeTable', {'data': json.dumps(traderdict, ensure_ascii=False)})

# def on_web_onrtnErrOrder(OrderField, InfoField):
#     '''
#     OrderFileld  = 104147,0.0,,10,1222288803|5|1, rb1905, DirectType.Buy, OffsetType.Open, 3599.0, 0.0, 15:02:20, , 0, 1, 1, OrderStatus.Canceled, 已撤单报单被拒绝SHFE:当前状态禁止此项操作, False, 1,
#     InfoField = {"ErrorID":-1, "ErrorMsg":"已撤单报单被拒绝SHFE:当前状态禁止此项操作"}
#     :param OrderField:
#     :param InfoField:
#     :return:
#     '''
#     # print("on_web_onrtnErrOrder")
#     # print (OrderField)
#     # print(InfoField)

#绑定后台回调数据到前台
# a.on_web_tick=on_web_tick                          #绑定行情回调到前台
a.t_OnRspQryAccount = on_web_userinfo      #绑定账户信息回调到前台
a.t_OnRspQryPosition = on_web_position      #绑定账户持仓到前台
a.t_OnRtnOrder = on_web_onrtnorder   #报单回报
a.t_OnRtnTrade = on_web_onrtnTrader      #成交回报
a.t_OnRtnErrOrder = on_web_onrtnorder  #错误订单回报 应该也给订单记录
a.q_on_tick = on_web_tick    #行情回调函数